<?php

namespace app\common;

use Kingbes\Attribute\Annotation;
use support\Request;
use think\Model;
use think\exception\ValidateException;

class Curd
{
    /**
     * 模型
     * @var Model
     */
    private $MODEL = null;

    // 验证类
    private string $VALIDATE = "";

    #[Annotation(title: "查询", view: true)]
    public function query(Request $request)
    {
        // 提交
        if ($request->method() === "POST") {
            // 数据
            $param = $request->all();
            // 查询
            $res = Tool::search($this->MODEL, $param)
                ->paginate([
                    "page" => $param["page"],
                    "list_rows" => $param["limit"],
                ]);
            // 返回
            return json([
                "code" => 0,
                "msg" => "获取成功",
                "count" => $res->total(),
                "data" => $res->toArray()["data"],
            ]);
        }
        // 模板渲染
        return fetch();
    }

    #[Annotation(title: "新增", view: true, auth: true)]
    public function add(Request $request)
    {
        // 提交
        if ($request->method() === "POST") {
            // 数据
            $data = $request->all();
            try {
                // 验证
                validate(validate: $this->VALIDATE, scene: "add", data: $data);
                // 新增
                $res = $this->MODEL::create($data);
                // 返回
                return success(msg: "新增成功", data: $res);
            } catch (ValidateException $e) {
                // 返回验证错误
                return error(
                    msg: $e->getError()["msg"],
                    data: $e->getError()["key"]
                );
            }
        }
        // 输出模板
        return fetch();
    }

    #[Annotation(title: "编辑", auth: true)]
    public function edit(Request $request)
    {
        // 查找
        $find = $this->MODEL::find($request->get("id"));
        // 赋值模板
        assign("find", $find);
        // 提交
        if ($request->method() === "POST") {
            // 数据
            $data = $request->all();
            try {
                // 验证
                validate(validate: $this->VALIDATE, scene: "edit", data: $data);
                // 更新数据
                $res = $this->MODEL::update($data);
                // 返回
                return success(msg: "编辑成功", data: $res);
            } catch (ValidateException $e) {
                // 返回验证错误
                return error(
                    msg: $e->getError()["msg"],
                    data: $e->getError()["key"]
                );
            }
        }
        // 输出模板
        return fetch();
    }

    #[Annotation(title: "删除", auth: true)]
    public function del(Request $request)
    {
        // 数据
        $ids = $request->get("ids");
        // 删除
        $destroy = $this->MODEL::destroy($ids);
        // 返回
        if ($destroy) {
            return success("删除成功");
        } else {
            return error(msg: "删除失败", data: $ids);
        }
    }
}
